// 在读多写少的环境中，可以优先使用读写互斥锁（sync.RWMutex），它比互斥锁更加高效。sync 包中的 RWMutex 提供了读写互斥锁的封装。
package main

import (
	"fmt"
	"sync"
	"time"
)

// 效率对比

// 声明读写锁
var rwlock sync.RWMutex
var mutex sync.Mutex
var wgg sync.WaitGroup

// 全局变量
var xx int

// 写数据
func write() {

	//mutex.Lock()
	rwlock.Lock()
	xx += 1
	fmt.Println("xx", xx)
	time.Sleep(10 * time.Millisecond)
	//mutex.Unlock()
	rwlock.Unlock()
	wgg.Done()
}

func read(i int) {

	//mutex.Lock()
	rwlock.RLock()
	time.Sleep(time.Millisecond)
	fmt.Println(xx)
	//mutex.Unlock()
	rwlock.RUnlock()

	wgg.Done()
}

// 互斥锁执行时间：18533117400
// 读写锁执行时间：1312065700
func main() {
	start := time.Now()
	wgg.Add(1)
	go write()

	for i := 0; i < 1000; i++ {
		wgg.Add(1)
		go read(i)
	}

	wgg.Wait()

	fmt.Println("运行时间：", time.Now().Sub(start))

}
